package gob.pgr.dao;

import gob.pgr.dto.Empleado;
import gob.pgr.dto.PgrConsultaCliente;
import gob.pgr.dto.PgrUsuario;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Repository;

import uk.ac.shef.wit.simmetrics.similaritymetrics.JaroWinkler;

@Repository("hibernateDao")
public class HibernateDaoImpl implements HibernateDao {
	@Autowired
	private HibernateTemplate hibernateTemplate;

	public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
		this.hibernateTemplate = hibernateTemplate;
	}

	public HibernateTemplate getHibernateTemplate() {
		return hibernateTemplate;
	}

	@Override
	public void insertar(Object objeto) throws Exception {
		// TODO Auto-generated method stub
		hibernateTemplate.save(objeto);
	}

	@Override
	public void modificar(Object objeto) throws Exception {
		// TODO Auto-generated method stub
		hibernateTemplate.update(objeto);
	}

	@Override
	public void eliminar(Object objeto) throws Exception {
		// TODO Auto-generated method stub
		hibernateTemplate.delete(objeto);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Empleado> obtenerEmpleados() throws Exception {
		Criteria criteria = hibernateTemplate.getSessionFactory().openSession().createCriteria(Empleado.class);
		criteria.setMaxResults(20);
		List<Empleado> resultados = criteria.list();
		return resultados;
	}

	@SuppressWarnings("unchecked")
	@Override
	public PgrUsuario obtenerUsuario(String usuario) throws Exception {
		PgrUsuario pgrUsuario = null;
		DetachedCriteria criteria = DetachedCriteria.forClass(PgrUsuario.class);
		criteria.add(Restrictions.eq("usuario", usuario));
		List<PgrUsuario> lista =  getHibernateTemplate().findByCriteria(criteria);
		if (lista != null && !lista.isEmpty() && lista.size() == 1) {
			pgrUsuario = lista.get(0);
		}
		return pgrUsuario;
	}

	@SuppressWarnings("unchecked")
	@Override
	public PgrConsultaCliente obtenerConsultaClientePorDui(String dui) throws Exception {
		PgrConsultaCliente pgrConsultaCliente = null;
		PgrConsultaCliente pgrConsultaClienteTmp = new PgrConsultaCliente();
		pgrConsultaClienteTmp.setDui(dui);
		List<PgrConsultaCliente> lista = getHibernateTemplate().findByExample(pgrConsultaClienteTmp);
		if (lista != null && !lista.isEmpty() && lista.size() == 1) {
			pgrConsultaCliente = lista.get(0);
		}
		return pgrConsultaCliente;
	}

	@Override
	public PgrConsultaCliente obtenerConsultaClientePorDuiNombres(String dui, String primerNombre, String segundoNombre, String primerApellido, String segundoApellido, String apellidoCasada) throws Exception {
		PgrConsultaCliente pgrConsultaCliente = obtenerConsultaClientePorDui(dui);
		if (pgrConsultaCliente != null) {
			JaroWinkler jaroWinkler = new JaroWinkler();
			float[] resultados = jaroWinkler.batchCompareSets(
				new String[] { primerNombre, segundoNombre, primerApellido, segundoApellido, apellidoCasada }, 
				new String[] { pgrConsultaCliente.getPrimerNombre(), pgrConsultaCliente.getSegundoNombre(), pgrConsultaCliente.getPrimerApellido(), pgrConsultaCliente.getSegundoApellido(), pgrConsultaCliente.getApellidoCasada() }
			);
			float suma = 0F;
			int comparaciones = resultados.length;
			for (float f : resultados) suma += f;
			double porcentaje = new Float((suma / comparaciones) * 100).doubleValue();
			if (Double.compare(porcentaje, 90) < 0) pgrConsultaCliente = null;
		}
		return pgrConsultaCliente;
	}

}
